// 【数据项筛选函数】

// 筛选字符串
// - @filter 筛选词
// - @item 数据项
// - @ignoreCase 是否忽略大小写
export function filterStr (filter, item, ignoreCase = true) {
  return (
    item &&
    (ignoreCase
      ? item.toLowerCase().includes(filter.toLowerCase())
      : item.includes(filter))
  )
}

// 筛选数值
export function filterNum (filter, item) {
  return item === +filter || String(item).includes(filter)
}

// 筛选枚举值
// - @enumMap 枚举值名称表：{ 枚举值: 名称 }
// - @prefix 枚举值前缀（用于避免歧义）
export function filterEnum (filter, item, enumMap = {}, prefix = '#') {
  return (
    prefix + item === filter || String(enumMap[item] || item).includes(filter)
  )
}

// 筛选指定类型
// - @type 筛选函数或类型（可为：str/num/enum/list/fields）
// - @...args 额外参数
export function filterType (filter, item, type, ...args) {
  if (typeof type === 'string') {
    type = FILTER_FUNC[type]
  }
  if (type instanceof Function) {
    if (type(filter, item, ...args)) return true
  }
  return false
}

// 筛选列表（满足一项即可）
export function filterList (filter, item, type, ...args) {
  return item.findIndex(i => filterType(filter, i, type, ...args)) >= 0
}

// 筛选多个字段（满足一项即可）
// - @fields: 字段筛选类型定义：{ 字段名: 筛选函数或类型，或：[筛选函数或类型, ...额外参数] }
export function filterFields (filter, item, fields = {}) {
  for (const name in fields) {
    let type = fields[name]
    let args = []
    if (type instanceof Array) {
      args = type.slice(1)
      type = type[0]
    }
    if (filterType(filter, item[name], type, ...args)) return true
  }
  return false
}

// 包装筛选多个字段的函数
export function wrapFilterFields (fields) {
  return (filter, item) => filterFields(filter, item, fields)
}

// 筛选类型映射函数表
const FILTER_FUNC = {
  str: filterStr,
  num: filterNum,
  enum: filterEnum,
  list: filterList,
  fields: filterFields
}
